package ai.zixing.mashibing.advance_class.secend.class01;

/**
 * 定义一种数：可以表示成若干（数量>1）连续正数和的数
 * 比如:
 * 5 = 2+3，5就是这样的数
 * 12 = 3+4+5，12就是这样的数
 * 1不是这样的数，因为要求数量大于1个、连续正数和
 * 2 = 1 + 1，2也不是，因为等号右边不是连续正数
 * 给定一个参数N，返回是不是可以表示成若干连续正数和的数
 */
public class Code03_MSumToN {

    public static void main(String[] args) {
        for (int num = 1; num < 200; num++) {
            System.out.println(num + " : " + isMSum1(num));
        }
    }

    // 暴力解
    private static boolean isMSum1(int num) {
        for (int i = 1; i <= num; i++) {
            int sum = i;
            for (int j = i + 1; j <= num; j++) {
                if (sum + j > num) {
                    break;
                }
                if (sum + j == num) {
                    return true;
                }
                sum += j;
            }
        }
        return false;
    }

    // == 暴力解可以得出，3以上，2的幂级都是false
    // (num & (num -1)) == 0 则 num 是 2 的某次方
    private static boolean isMSum2(int num) {
        if (num < 3) {
            return false;
        }
        // 判断 num 是不是 2 的某次方
        // num 的二进制只有一个 1
        return (num & (num - 1)) != 0;
    }
}
